Zum Hauptinhalt springen

Ereignisse

Call Recording sendet zwei Ereignisse („FpEvents") auf dem anlageninternen Ereignisbus der Fluxpunkt-Module: StartRecordingEvent beim Start jeder Aufzeichnung und TranscriptionEvent nach Abschluss einer Transkription — Letzteres mit dem vollständigen Transkriptionstext in der Nutzlast. Typische Konsumenten sind EventBridge (Weiterleitung als Webhook, E-Mail, Syslog oder Datenbankeintrag) sowie eigene STARFACE-Module, die Ereignisse direkt abonnieren.

Verwendung durch Dritte

Diese Schnittstelle ist für die Nutzung durch Drittsysteme freigegeben. Änderungen und Erweiterungen werden je Version in den Release Notes dokumentiert.

Grundlagen

  • Typ: FpEvents — der modulübergreifende Ereignismechanismus der Fluxpunkt-Module auf dem anlageninternen Ereignisbus. Es handelt sich um keine Netzwerkschnittstelle: Ereignisse sind nur innerhalb der Anlage erreichbar; nach außen gelangen sie über EventBridge.
  • Identifikator: der Ereignisname StartRecordingEvent bzw. TranscriptionEvent. Die Namen sind anlagenweit gültig und unabhängig vom Namen der Modulkonfiguration. In EventBridge erscheinen die Ereignisse unter der Quelle de.fluxpunkt.fpevent (Kategorie FLUXPUNKT).
  • Nutzlast: ein JSON-Objekt. Felder ohne Wert (null) entfallen in der Nutzlast; unbekannte Felder werden beim Empfang ignoriert.
  • Zugriff: EventBridge abonniert Ereignisse per Konfiguration. Eigene Module verwenden die Modulfunktionen FpEvent abonnieren / FpEvent abbestellen (FpRegisterEvents/FpUnregisterEvents) — Download und Anleitung im Artikel Schnittstellen & APIs.
  • Zustellung: Fire-and-forget ohne Empfangsbestätigung. Fehler in einem Konsumenten beeinflussen weder die Aufzeichnung noch andere Konsumenten.
  • Katalog: Der anlagenweite Ereigniskatalog wird in der Ereignisliste der EventBridge-Dokumentation geführt; die vollständige Feldreferenz der Call-Recording-Ereignisse folgt auf dieser Seite.

StartRecordingEvent — Aufzeichnung gestartet

Wird unmittelbar nach dem Start des Mitschnitts veröffentlicht — also nach Auswertung der Aufzeichnungseinstellung, etwaiger Ansagen und einer etwaigen Opt-In-/Opt-Out-Abfrage. Wird ein Anruf nicht aufgezeichnet (Ausnahmeliste, Opt-Out, kein Treffer in den Einstellungen), entsteht kein Ereignis. Je aufgezeichnetem Anruf wird genau ein Ereignis gesendet, auch wenn mehrere Speicherziele konfiguriert sind.

FeldTypBedeutung
callIdStringSTARFACE-Call-UUID des Anrufs. Identisch mit dem Wert CallId in der Metadatendatei und der Spalte callid der Protokolltabelle.
startTimeLongStartzeitpunkt der Aufzeichnung als Unix-Zeitstempel in Millisekunden. Zugleich der erste Bestandteil des Datei-Basisnamens.
callerNameStringAufgelöster Name des Anrufers (leer, wenn keine Namensauflösung vorliegt).
calleeNameStringDerzeit nicht befüllt (immer leer).
calleeAccountIdIntegerDerzeit nicht befüllt (immer 0).
callerNumberStringSignalisierte Rufnummer des Anrufers.
calledNumberStringGerufene Nummer (bei internen Zielen die Durchwahl).
callerAccountIdIntegerDerzeit nicht befüllt (immer 0).
channelStringAsterisk-Kanalname des aufgezeichneten Kanals. Korrelationsschlüssel zum späteren TranscriptionEvent.
instanceIdStringUUID der Modulkonfiguration (Instanz), die die Aufzeichnung ausgelöst hat.
incomingBooleantrue bei eingehenden, false bei ausgehenden Anrufen. Entspricht in/out in der Spalte direction der Protokolltabelle.
Beispiel: StartRecordingEvent
{
"callId": "5e8f0f5a-1d24-4f6b-9c3a-7b2f9d4e8a11",
"startTime": 1739948363496,
"callerName": "Max Mustermann",
"calleeName": "",
"calleeAccountId": 0,
"callerNumber": "004970222797821",
"calledNumber": "31",
"callerAccountId": 0,
"channel": "SIP/2001-00000042",
"instanceId": "5c9c8140-aaa8-40b4-9b9f-fdd686feb4f5",
"incoming": true
}

TranscriptionEvent — Transkription abgeschlossen

Wird veröffentlicht, sobald eine Aufzeichnung transkribiert, in ein einheitliches Textformat konvertiert und abgelegt wurde. Voraussetzungen: In der Aufzeichnungseinstellung ist ein Transkriptionsprofil gewählt und die Option „Transkriptionen bereitstellen" aktiviert (siehe Konfiguration). Die Transkription läuft asynchron nach Gesprächsende; das Ereignis erscheint daher zeitversetzt — je nach Gesprächslänge und Transkriptionsprovider Sekunden bis Minuten nach dem Auflegen, in jedem Fall vor dem Upload in die Speicherziele.

FeldTypBedeutung
startTimeLongStartzeitpunkt der zugrunde liegenden Aufzeichnung in Millisekunden — identisch mit startTime des StartRecordingEvent und dem Zeitstempel im Datei-Basisnamen.
channelStringAsterisk-Kanalname der Aufzeichnung (aus der Metadatendatei). Korrelationsschlüssel zum StartRecordingEvent.
transcriptionJsonStringVollständige Transkription im providerunabhängigen Einheitsformat — ein JSON-Objekt, das als String übergeben wird (JSON-in-String, siehe unten).
rawTranscriptionStringUnveränderte Rohantwort des Transkriptionsproviders als JSON-String. Struktur providerabhängig; für Auswertungen transcriptionJson bevorzugen.
serviceStringVerwendeter Transkriptionsprovider: deepgram, starface-whisper, whisperx, openai-whisper oder elevenlabs.
instanceNameStringName der Modulkonfiguration, die die Transkription erstellt hat.
calledNumberStringGerufene Nummer (aus der Metadatendatei).
callerNumberStringRufnummer des Anrufers (aus der Metadatendatei).
callerNameStringName des Anrufers (aus der Metadatendatei; entfällt, wenn unbekannt).
voicemailBooleanUnterscheidet Gesprächs- von Voicemail-Transkriptionen. Bei Ereignissen von Call Recording stets false.
Beispiel: TranscriptionEvent
{
"startTime": 1739948363496,
"channel": "SIP/2001-00000042",
"transcriptionJson": "{\"time\":1739948363496,\"confidence\":0.96,\"paragraphs\":[{\"text\":\"Guten Tag, mein Name ist Mustermann …\",\"channel\":0,\"speaker\":0,\"start\":1.42,\"end\":6.87,\"confidence\":0.97}],\"source\":{\"provider\":\"deepgram\",\"model\":\"nova-2\",\"speakerLayout\":\"channel_per_side\"}}",
"rawTranscription": "{ … providerabhängige Rohantwort … }",
"service": "deepgram",
"instanceName": "Call Recording",
"calledNumber": "31",
"callerNumber": "004970222797821",
"callerName": "Max Mustermann",
"voicemail": false
}

Struktur von transcriptionJson

transcriptionJson enthält — nach dem Dekodieren des Strings — ein JSON-Objekt mit folgender Struktur:

FeldTypBedeutung
timeLongStartzeitpunkt der Aufzeichnung in Millisekunden (identisch mit startTime).
confidenceFloatGesamtkonfidenz der Transkription (0–1).
paragraphsArrayGesprächsverlauf als Liste von Absätzen (siehe folgende Tabelle).
sourceObjektHerkunft der Transkription; kann bei älteren Transkriptionen fehlen.
source.providerStringProvidertyp, z. B. deepgram.
source.modelStringVerwendetes Modell (kann fehlen).
source.speakerLayoutStringInterpretation von channel/speaker: channel_per_side (Kanal = Gesprächsseite: 0 = Anrufer, 1 = Angerufener), channel_per_side_heuristic (wie zuvor, aber heuristisch zugeordnet), diarized (speaker = Sprecherindex, channel nicht aussagekräftig) oder single_speaker (nur ein Sprecher).

Jeder Eintrag in paragraphs:

FeldTypBedeutung
textStringTranskribierter Text des Absatzes.
channelIntegerAudiokanal (Bedeutung gemäß source.speakerLayout).
speakerIntegerSprecherindex innerhalb des Kanals bzw. der Diarisierung.
startFloatBeginn des Absatzes in Sekunden ab Aufzeichnungsstart.
endFloatEnde des Absatzes in Sekunden ab Aufzeichnungsstart.
confidenceFloatKonfidenz des Absatzes (0–1).
transcriptionJson — dekodiert
{
"time": 1739948363496,
"confidence": 0.96,
"paragraphs": [
{
"text": "Guten Tag, mein Name ist Mustermann, ich rufe wegen meiner Bestellung an.",
"channel": 0,
"speaker": 0,
"start": 1.42,
"end": 6.87,
"confidence": 0.97
},
{
"text": "Guten Tag Herr Mustermann, was kann ich für Sie tun?",
"channel": 1,
"speaker": 0,
"start": 7.02,
"end": 9.85,
"confidence": 0.95
}
],
"source": {
"provider": "deepgram",
"model": "nova-2",
"speakerLayout": "channel_per_side"
}
}
Anwendungsbeispiel

Ein CRM-Anbieter abonniert TranscriptionEvent über EventBridge als Webhook. Sein Endpunkt dekodiert transcriptionJson, hängt den Gesprächsverlauf an den per callerNumber ermittelten Kundendatensatz an und nutzt startTime zur Zuordnung des Ruflisteneintrags — ohne Datenbankzugriff auf die Anlage.

Fehler-/Sonderfälle

SituationVerhalten
Anruf wird nicht aufgezeichnet (Ausnahmeliste, Opt-Out, kein Treffer)Kein StartRecordingEvent.
Option „Transkriptionen bereitstellen" deaktiviertDie Transkriptionsdatei wird zwar erstellt und hochgeladen, aber es wird kein TranscriptionEvent gesendet.
Transkription schlägt fehlBis zu 3 Versuche (Wiederholung im 30-Sekunden-Takt der Nachverarbeitung); danach wird die Transkription verworfen — es gibt kein Fehlerereignis.
Metadatendatei nicht lesbarTranscriptionEvent entfällt; die Ursache steht im Modul-Log.
callerAccountId, calleeAccountId, calleeName in StartRecordingEventDerzeit nicht befüllt (0 bzw. leer); die Felder sind für künftige Erweiterungen reserviert.
transcriptionJson/rawTranscriptionJSON-in-String: vor der Auswertung dekodieren. Bei Serialisierungsfehlern kann das jeweilige Feld fehlen.
TranscriptionEvent enthält keine Call-IDKorrelation über startTime + channel mit dem vorangegangenen StartRecordingEvent (dieses enthält die callId).

Ein ausbleibendes Ereignis ist damit stets ein Hinweis, im Modul-Log nachzusehen.

Versionierung & Kompatibilität

Ereignisnamen und Feldnamen sind stabile Verträge; Erweiterungen erfolgen additiv (neue Ereignisse, neue optionale Felder). Verarbeiten Sie Nutzlasten daher tolerant gegenüber zusätzlichen Feldern. Den anlagenweiten Ereigniskatalog führt die Ereignisliste der EventBridge-Dokumentation; Änderungen dokumentieren die Release Notes der jeweiligen Modulversion.